package com.travel.security.service;

// 导入所需的类和接口
//服务类，实现了 UserDetailsService 接口。
//它使用 UserMapper 来查询用户信息，并使用 UserDetailsImpl 来构建 UserDetails 对象。
//loadUserByUsername 方法根据用户名查询用户信息，并将其转换为 UserDetails 对象返回。
//如果查询不到用户，会抛出 UsernameNotFoundException 异常。
import com.travel.mapper.user.UserMapper; // 用户Mapper接口，用于数据库操作
import com.travel.model.entity.auth.User; // User实体类，代表用户信息
import com.travel.service.impl.User.UserDetailsImpl; // UserDetailsImpl类，用于构建UserDetails对象
import lombok.RequiredArgsConstructor; // Lombok注解，用于简化构造函数的编写
import org.springframework.security.core.userdetails.UserDetails; // UserDetails接口，定义了用户详细信息的结构
import org.springframework.security.core.userdetails.UserDetailsService; // UserDetailsService接口，用于根据用户名加载用户详细信息
import org.springframework.security.core.userdetails.UsernameNotFoundException; // UsernameNotFoundException异常，当找不到用户时抛出
import org.springframework.stereotype.Service; // Spring注解，标记这是一个服务组件

// 使用@Service注解标记这个类为Spring管理的Service组件
@Service
// 使用@RequiredArgsConstructor注解来自动生成包含所有final字段的构造函数
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService { // 实现UserDetailsService接口

    // 注入UserMapper，用于查询用户信息
    private final UserMapper userMapper;

    // 实现UserDetailsService接口的loadUserByUsername方法
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 通过UserMapper根据用户名查询用户信息
        User user = userMapper.findByUsername(username)
                // 如果没有找到用户，抛出UsernameNotFoundException异常
                .orElseThrow(() -> new UsernameNotFoundException("未找到用户: " + username));

        // 将User对象转换为UserDetails对象并返回
        // UserDetailsImpl.build方法用于构建UserDetails对象
        return UserDetailsImpl.build(user);
    }
}